package com.blx.utils;


import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;

public class EncryptUtility {
	
	/** 
	 * 加密 
	 *  
	 * @param content 需要加密的内容 
	 * @param password  加密密码 
	 * @return 
	 */  
	public static String encrypt(String content, String password) {  
	        try {             

	                byte[] raw = password.getBytes("UTF-8");
	        		SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");

	        		Cipher cipher = Cipher.getInstance("AES");
	        		cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
	        		
	        		byte[] values=content.getBytes("UTF-8");

	        		byte[] encrypted = cipher.doFinal(values);
	        	    return Base64Helper.encode(encrypted);
	        		    
	        } catch (NoSuchAlgorithmException e) {  
	                e.printStackTrace();  
	        } catch (NoSuchPaddingException e) {  
	                e.printStackTrace();  
	        } catch (InvalidKeyException e) {  
	                e.printStackTrace();  
	        } catch (UnsupportedEncodingException e) {  
	                e.printStackTrace();  
	        } catch (IllegalBlockSizeException e) {  
	                e.printStackTrace();  
	        } catch (BadPaddingException e) {  
	                e.printStackTrace();  
	        }  
	        return null;  
	}  

	/**解密 
	 * @param content  待解密内容 
	 * @param password 解密密钥 
	 * @return 
	 * @throws UnsupportedEncodingException 
	 */  
	public static String decrypt(String content, String password) {  
	        try {  
	                byte[] raw = password.getBytes("utf-8");
	         		SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");

	         		Cipher cipher = Cipher.getInstance("AES");
	         		cipher.init(Cipher.DECRYPT_MODE, skeySpec);

	         		byte[] dencrypted = Base64Helper.decode(content);
	         		byte[] original = cipher.doFinal(dencrypted);
	         		String originalString = new String(original, "utf-8");
	         		return originalString;
        
	        } catch (NoSuchAlgorithmException e) {  
	                e.printStackTrace();  
	        } catch (NoSuchPaddingException e) {  
	                e.printStackTrace();  
	        } catch (InvalidKeyException e) {  
	                e.printStackTrace();  
	        } catch (IllegalBlockSizeException e) {  
	                e.printStackTrace();  
	        } catch (BadPaddingException e) {  
	                e.printStackTrace();  
	        } catch(UnsupportedEncodingException e){
	        	     e.printStackTrace(); 
	        } 
	        return null;  
	}  

	public static String parseByte2HexStr(byte buf[]) {
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < buf.length; i++) {
			String hex = Integer.toHexString(buf[i] & 0xFF);
			if (hex.length() == 1) {
				hex = '0' + hex;
			}
			sb.append(hex.toUpperCase());
		}
		return sb.toString();
	}
	
	public static byte[] parseHexStr2Byte(String hexStr) {
		if (hexStr.length() < 1)
			return null;
		byte[] result = new byte[hexStr.length() / 2];
		for (int i = 0; i < hexStr.length() / 2; i++) {
			int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
			int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2),
					16);
			result[i] = (byte) (high * 16 + low);
		}
		return result;
	}
}
